package GraphGenerator;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
import java.util.Vector;



/*
	<troncon>
	<ville1>villeA</ville1>
	<ville2>villeD</ville2>
	<vitesse>100</vitesse>
	<touristique>non</touristique>
	<radar>non</radar>
	<payant>non</payant>
	<longueur>100</longueur>
</troncon> 
*/

public class GenerateurDeRoute 
{

	private FileWriter fw ;
	private int nombreVilles;
	
	private  int vitesseMini = 10 ;
	private  int vitesseMaxi = 100 ;
	
	private  int longueurMini = 10 ;
	private  int longueurMaxi = 100 ;
	
	private  String touristique = "non" ;
	private  String payant		= "non" ;
	private  String radar		= "non" ;
	
	
	public GenerateurDeRoute(FileWriter fw , int nombreVilles)
	{
		longueurMini= nombreVilles;
		longueurMaxi= 2*longueurMini;
		this.fw = fw ;
		this.nombreVilles = nombreVilles;
	}
	

	public void ecrireRouteRadar(int i) throws IOException
	{
		Random rand = new Random();
		
        String typeRoute ="";
        int typeroute = rand.nextInt(2);
        switch (typeroute) 
        {
			case 0: typeRoute = "departementale" ;break;
			case 1: typeRoute = "nationale" ;break;
			default:typeRoute = "departementale" ;break; 
		}
		
		ecrireEnteteRoute(i,typeRoute,"radar");
    	
    	
		for( int j = 0 ; j < nombreVilles ; j ++ )
		{

        	
        	ecrireTroncon( j ,
 			       (j+1) ,
 			       ( vitesseMini+ rand.nextInt( vitesseMaxi - vitesseMini ) ) ,
 			       this.touristique,
 			       "oui",
 			       this.payant,
 			       ( longueurMini+ rand.nextInt( longueurMaxi - longueurMini ) )
 	              ) ;


        }
        

    	fw.append("</route>");
	}
	

	public void ecrireRouteRapide(int i) throws IOException
	{
		Random rand = new Random();
		
        String typeRoute ="";
        int typeroute = rand.nextInt(2);
        switch (typeroute) 
        {
			case 0: typeRoute = "departementale" ;break;
			case 1: typeRoute = "nationale" ;break;
			default:typeRoute = "departementale" ;break; 
		}
		
		ecrireEnteteRoute(i,typeRoute,"rapide");
    	
    	
		for( int j = 0 ; j < nombreVilles ; j ++ )
		{

        	
        	ecrireTroncon( j ,
        			       (j+1) ,
        			       (  vitesseMaxi +1) ,
        			       this.touristique,
        			       this.radar,
        			       this.payant,
        			       ( 1 )
        	              ) ;


        }
        

    	fw.append("</route>");
	}
	
	
	public void ecrireRouteCourte(int i) throws IOException
	{
		Random rand = new Random();
		
        String typeRoute ="";
        int typeroute = rand.nextInt(2);
        switch (typeroute) 
        {
			case 0: typeRoute = "departementale" ;break;
			case 1: typeRoute = "nationale" ;break;
			default:typeRoute = "departementale" ;break; 
		}
		
		ecrireEnteteRoute(i,typeRoute,"courte");
    	
    
		for( int j = 0 ; j < nombreVilles ; j ++ )
		{

        	
        	ecrireTroncon( j ,
        			       (j+1) ,
        			       ( vitesseMini+ rand.nextInt( vitesseMaxi - vitesseMini ) ) ,
        			       this.touristique,
        			       this.radar,
        			       this.payant,
        			       ( 1 )
        	              ) ;
        	/*
        	 		<troncon>
						<ville1>villeA</ville1>
						<ville2>villeD</ville2>
						<vitesse>100</vitesse>
						<touristique>non</touristique>
						<radar>non</radar>
						<payant>non</payant>
						<longueur>100</longueur>
					</troncon> 
        	 */

        }
        

    	
    	fw.append("</route>");
	}
	
	public void ecrireAutoRoute(int i ) throws IOException
	{
		Random rand = new Random();
		
		ecrireEnteteRoute(i,"autoroute" ,"autoroute");
    	
		for( int j = 0 ; j < nombreVilles ; j ++ )
		{

        	
        	ecrireTroncon( j ,
        			       (j+1) ,
        			       ( vitesseMini+ rand.nextInt( vitesseMaxi - vitesseMini ) ) ,
        			       this.touristique,
        			       this.radar,
        			       this.payant,
        			       ( longueurMini+ rand.nextInt( longueurMaxi - longueurMini ) )
        	              ) ;


        }

    	fw.append("</route>");
	}

	
	private void ecrireEnteteRoute(int i , String typeroute , String prefixeNom) throws IOException
	{		
		String nomRoute = prefixeNom+"route"+(i);
    	
    	/*
        String typeRoute ="";
        int typeroute = rand.nextInt(2);
        switch (typeroute) 
        {
			case 0: typeRoute = "departementale" ;break;
			case 1: typeRoute = "nationnale" ;break;
			default:typeRoute = "departementale" ;break; 
		}
		*/
        
        System.out.println("-");
    	fw.append("<route>\n");
    	fw.append("\t<nom>"+nomRoute+"</nom>\n");
    	fw.append("\t<type>"+typeroute+"</type>\n");
    	fw.flush();
	}
	
	private void ecrireTroncon( int idVille1 , int idVille2 ,int vitesse, String touristique, String radar, String payant , int longueur) throws IOException
	{
 

		fw.append("\t<troncon>\n");
    	
    	fw.append("\t\t<ville1>ville"+ idVille1 +"</ville1>\n");
    	fw.append("\t\t<ville2>ville"+ idVille2 +"</ville2>\n");
    	
    	fw.append("\t\t<vitesse>"+ vitesse +"</vitesse>\n");
    	
    	fw.append("\t\t<touristique>"+touristique+"</touristique>\n");

    	fw.append("\t\t<radar>"+radar+"</radar>\n");
    	
    	fw.append("\t\t<payant>"+payant+"</payant>\n");
    	
    	fw.append("\t\t<longueur>"+ longueur +"</longueur>\n");
    	fw.append("\t</troncon>\n");
    	fw.flush();
	}
	
	public void ecrireRoute( int i ) throws IOException
	{
		Random rand = new Random();
		
    	
        String typeRoute ="";
        int typeroute = rand.nextInt(2);
        switch (typeroute) 
        {
			case 0: typeRoute = "departementale" ;break;
			case 1: typeRoute = "nationale" ;break;
			default:typeRoute = "departementale" ;break; 
		}
		
		ecrireEnteteRoute(i,typeRoute,"");
    	
    	Vector<Integer> idvilles = new Vector<Integer>();
    	for( int id=0 ; id< nombreVilles-1 ; id++ ){ idvilles.add( id); }
    	
    	int prec_id = 0;
    	int suiv_id = 0;
    	
    	int longueurRoute =  nombreVilles-2;
        for( int j =0 ; j< longueurRoute ; j++)
        {
        	int idVille1 = idvilles.get(prec_id); 
        	idvilles.remove(prec_id);
        	
        	suiv_id = rand.nextInt( idvilles.size() );
        	
//        	System.out.println("--");
//        	for( int id : idvilles )
//        	{
//        		System.out.println("id dispo ="+id);
//        	}
//        	System.out.println("--");
        	
        	int idVille2 = idvilles.get(suiv_id) ;
        	prec_id = suiv_id ;
        	
        	ecrireTroncon( idVille1 ,
        			       idVille2 ,
        			       ( vitesseMini+ rand.nextInt( vitesseMaxi - vitesseMini ) ) ,
        			       this.touristique,
        			       this.radar,
        			       this.payant,
        			       ( longueurMini+ rand.nextInt( longueurMaxi - longueurMini ) )
        	              ) ;
        	/*
        	 		<troncon>
						<ville1>villeA</ville1>
						<ville2>villeD</ville2>
						<vitesse>100</vitesse>
						<touristique>non</touristique>
						<radar>non</radar>
						<payant>non</payant>
						<longueur>100</longueur>
					</troncon> 
        	 */

        }
        
        /*ecriture du dernier troncon*/
    	ecrireTroncon( idvilles.get(suiv_id) ,
			           nombreVilles ,
			           ( vitesseMini+ rand.nextInt( vitesseMaxi - vitesseMini ) ) ,
			           this.touristique,
			           this.radar,
			           this.payant,
			           ( longueurMini+ rand.nextInt( longueurMaxi - longueurMini ) )
	              	) ;
    	fw.append("</route>");
	}
	
	
}
